package com.peihongli.spring;

import com.peihongli.dao.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MyProxy implements InvocationHandler {
    private UserDao userDao;
    public Object createProxy(UserDao userDao){
//        传入对象
        this.userDao = userDao;
//        获得类加载器
        ClassLoader classLoader = MyProxy.class.getClassLoader();
//        获得被代理类中所有的接口
        Class[] classes = userDao.getClass().getInterfaces();
/**
 * 通过Proxy类的newProxyInstance方法创建代理对象，我们来看下方法中的参数
 * 第一个参数：people.getClass().getClassLoader()，使用handler对象的classloader对象来加载我们的代理对象
 * 第二个参数：people.getClass().getInterfaces()，这里为代理类提供的接口是真实对象实现的接口，这样代理对象就能像真实对象一样调用接口中的所有方法
 * 第三个参数：handler，我们将代理对象关联到上面的InvocationHandler对象上
 */
        return Proxy.newProxyInstance(classLoader,classes,this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        MyAspect myAspect = new MyAspect();
        myAspect.checkPermissions();
        Object obj = method.invoke(userDao,args);
        myAspect.log();
        return obj;
    }
}
